package com.sky.service.impl;

import com.sky.entity.Orders;
import com.sky.mapper.WorkspaceMapper;
import com.sky.service.WorkspaceService;
import com.sky.vo.BusinessDataVO;
import com.sky.vo.OrderOverViewVO;
import com.sky.vo.SetmealOverViewVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.HashMap;
import java.util.Map;

import static java.lang.Double.NaN;

@Slf4j
@Service
public class WorkspaceServiceImpl implements WorkspaceService {
    @Autowired
    private WorkspaceMapper workspaceMapper;

    /**
     * 查询营业数据
     * @return
     */
@Override
public BusinessDataVO getBusinessData(LocalDateTime begin,LocalDateTime end) {
    // 创建返回值对象，用于封装业务数据
    BusinessDataVO businessDataVO = new BusinessDataVO();
    // 1. 查询当日新增用户数
    // 创建参数 map，用于查询新增用户数
    Map<String, Object> newUserMap = new HashMap<>();
    // 添加开始时间参数
    newUserMap.put("begin", begin);
    // 添加结束时间参数
    newUserMap.put("end", end);
    // 调用 Mapper 查询新增用户数
    Integer newUsers = workspaceMapper.getNewUsers(newUserMap);
    // 设置新增用户数到返回对象
    businessDataVO.setNewUsers(newUsers);
    // 2. 查询当日营业额
    // 创建新的 map，继承时间参数
    Map<String, Object> turnoverMap = new HashMap<>(newUserMap);
    // 添加订单状态参数，只查询已完成订单
    turnoverMap.put("status", Orders.COMPLETED);
    // 查询当日营业额（已完成订单的总金额）
    Double turnover = workspaceMapper.selectSumByMap(turnoverMap);
    // 处理营业额为 null 的情况，将营业额设置为 0.0
    turnover = turnover == null ? 0.0 : turnover;
    // 设置营业额到返回对象
    businessDataVO.setTurnover(turnover);
    // 3. 查询当日有效订单数
    // 创建新的 map，继承时间参数
    Map<String, Object> validOrderMap = new HashMap<>(newUserMap);
    // 添加订单状态参数，只查询已完成订单
    validOrderMap.put("status", Orders.COMPLETED);
    // 查询有效订单数（已完成订单的数量）
    Integer validOrderCount = workspaceMapper.selectCountByMap(validOrderMap);
    // 设置有效订单数到返回对象
    businessDataVO.setValidOrderCount(validOrderCount);
    // 4. 查询当日订单总数，用于计算订单完成率
    // 创建新的 map，继承时间参数
    Map<String, Object> totalOrderMap = new HashMap<>(newUserMap);
    // 不限制订单状态，即查询所有状态的订单
    totalOrderMap.put("status", null);
    // 查询当日所有订单总数
    Integer orderCount = workspaceMapper.selectCountByMap(totalOrderMap);
    // 计算订单完成率，并处理除零异常
    Double orderCompletionRate = 0.0;
    if (orderCount != null && orderCount > 0) {
        // 订单完成率 = 有效订单数 / 总订单数
        orderCompletionRate = validOrderCount.doubleValue() / orderCount;
    }
    // 输出订单完成率到日志，便于调试
    log.info("订单完成率：{}", orderCompletionRate);
    // 设置订单完成率到返回对象
    businessDataVO.setOrderCompletionRate(orderCompletionRate);
    // 5. 查询当日平均客单价
    Double unitPrice = 0.0;
    if (validOrderCount != null && validOrderCount > 0) {
        // 平均客单价 = 营业额 / 有效订单数
        // 如果营业额为 null，默认为 0.0
        unitPrice = (turnover == null ? 0.0 : turnover) / validOrderCount;
    }
    // 设置平均客单价到返回对象
    businessDataVO.setUnitPrice(unitPrice);
    // 返回封装好的业务数据对象
    return businessDataVO;
}

    /**
     * 套餐总览
     *
     * @return
     */
    @Override
    public SetmealOverViewVO overviewSetmeals() {
        SetmealOverViewVO setmealOverViewVO = new SetmealOverViewVO();
        //  查询已停售套餐数量
        Map map = new HashMap();
        map.put("status", SetmealOverViewVO.DISCONTINUED);
        Integer discontinued = workspaceMapper.selectSetmealBystatus(map);
        setmealOverViewVO.setDiscontinued(discontinued);
        // 查询已启售套餐数量
        map.put("status", SetmealOverViewVO.SOLD);
        Integer sold = workspaceMapper.selectSetmealBystatus(map);
        setmealOverViewVO.setSold(sold);
        return setmealOverViewVO;
    }

    /**
     * 菜品总览
     *
     * @return
     */
    @Override
    public SetmealOverViewVO overviewDishes() {
        SetmealOverViewVO setmealOverViewVO = new SetmealOverViewVO();
        Map  map = new HashMap();
        //  查询已停售菜品数量
        map.put("status", SetmealOverViewVO.DISCONTINUED);
        Integer discontinued = workspaceMapper.selectDishBystatus(map);
        setmealOverViewVO.setDiscontinued(discontinued);
        //  查询已启售菜品数量
        map.put("status", SetmealOverViewVO.SOLD);
        Integer sold = workspaceMapper.selectDishBystatus(map);
        setmealOverViewVO.setSold(sold);
        //  返回
        return setmealOverViewVO;
    }

    /**
     * 订单总览
     *
     * @return
     */
    @Override
    public OrderOverViewVO overviewOrders() {
        //  创建返回值对象
        OrderOverViewVO orderOverViewVO = new OrderOverViewVO();
        //  查询全部订单
        Map map = new HashMap();
        map.put("status", null);
        Integer allOrders = workspaceMapper.selectCountByMap(map);
        orderOverViewVO.setAllOrders(allOrders);
        //  已取消数量
        map.put("status", OrderOverViewVO.ORDER_CANCELLED);
        Integer cancelledOrders = workspaceMapper.selectCountByMap(map);
        orderOverViewVO.setCancelledOrders(cancelledOrders);
        //  已完成数量
        map.put("status", OrderOverViewVO.ORDER_COMPLETE);
        Integer completedOrders = workspaceMapper.selectCountByMap(map);
        orderOverViewVO.setCompletedOrders(completedOrders);
        //  待派单数量
        map.put("status", OrderOverViewVO.WAITING_CONFIRM);
        Integer deliveredOrders = workspaceMapper.selectCountByMap(map);
        orderOverViewVO.setDeliveredOrders(deliveredOrders);
        //  待接单数量
        map.put("status", OrderOverViewVO.WAITING_PAYMENT);
        Integer waitingOrders = workspaceMapper.selectCountByMap(map);
        orderOverViewVO.setWaitingOrders(waitingOrders);
        //  返回
        return orderOverViewVO;
    }


}
